home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Purity
/
Purity #21 (1994-01-12)(Diesel)(DE)[WB].zip
/
Purity #21 (1994-01-12)(Diesel)(DE)[WB].adf
/
PCQ-Dokus
/
KurzReferenzPCQ
next >
Wrap
Text File
|
1993-12-13
|
20KB
|
704 lines
*******************************************************************
KURZREFERENZ FÜR PCQ-PASCAL
*******************************************************************
Was nun folgt, ist eine Mischung aus Übersetzung der englischen
Anleitung zu PCQ und einer allgemeinen Erklärung der Sprache Pascal.
Sie soll Einsteigern helfen, schneller mit der Sprache klarzukommen,
erhebt aber keinen Anspruch auf Richtigkeit und Vollständigkeit.
Mehr und bessere Informationen entnimmt man immer noch der Original-
anleitung von Patrick Quaid, dem Programmierer von PCQ. Für diese
deutsche Kurzreferenz gelten dieselben Copyrightbestimmung wie für
die Originalanleitung des PCQ-Compilers 1.2b.
Andreas Neumann , 06.08.1992
===================================================================
Programmstruktur in Pascal
===================================================================
Die normale Struktur von Pascalprogrammen sieht wie folgt aus :
Programm
|
-----------------------------------------------------
| |
Programmkopf Block
|
-----------------------------
| |
Vereinbarungsteil Anweisungsteil
Der Programmkopf besteht aus dem reservierten Wort "PROGRAM" und dem Namen
des Programms, abgeschlossen durch ein Semikolon.
Beispiel :
PROGRAM EinProgramm;
Im Vereinbarungsteil werden Variablen und Konstanten deklariert, wobei
die Konstantendeklaration mit dem reservierten Wort "CONST" und die
Variablendeklaration mit dem Wort "VAR" eingeleitet wird.
Beispiel :
CONST
Zehn = 10;
VAR
EinString : String;
Der Anweisungsteil besteht aus den Anweisungsbefehlen, dem eigentlichen
Programm also.
Eingerahmt wird er von den reservierten Wörtern "BEGIN" und "END.".
Beispiel (leere Anweisungsblock) :
BEGIN
END.
===================================================================
Typendeklarationen
===================================================================
Folgende Definitionen scheinen auf den ersten Blick unverständlich,
erweisen sich bei näherer Betrachtung jedoch als einleuchtend. So
beginnen sie sehr allgemein und werden dann Stück für Stück näher definiert.
<Typendefintion> ::= Type <Typendefinitionen>;
<Typendefinitionen> ::= <Typendefinition>; <Typendefinitionen> |
<Typendefinition>
<Typendefinition> ::= <Bezeichner> = <Typensepzifikation>
<Typenspezifikation> ::= <Bezeichner> |
<Bereich> |
^<Typenspezifikation> |
(<Bezeichnerliste>) |
<Felddefinition> |
<Verbunddefinition> |
file of <Typenspezifikation>
<Bereich> ::= <Konstanter Ausdruck> .. <Konstanter Ausdruck>
<Felddefinition> ::= array [<Bereich>] of <Typenspezifikation> |
array <Bezeichner> of <Typenspezifikation>
<Verbunddefinition> ::= record <Variable Definitionen> end
Numerische Typen
-------------------
Byte Länge : 1 Byte
Speichervermögen : 0 - 255 (ganzzahlig)
Short Länge : 2 Byte
Speichervermögen : -32768 - 32767 (ganzzahlig)
Integer Länge : 4 Byte
Speichervermögen : ca. -2 billion - 2 billion (ganzzahlig)
Real Länge : 4 Byte
Speichervermögen : 10 * 10^18 - ca 5 * 10^-20, sowohl positiv
als auch negativ. ( 5 * 10^-20 entspricht
etwa 0.00000000000000000005)
Man sollte aber nur auf 5 oder
6 Nachkommastellen zurückgreifen.
Andere Ordinale Typen
-------------------------
Char Länge : 1 Byte
Speichervermögen : ein ASCII-Zeichen (z.B. 'a')
Boolean Länge : 1 Byte
Speichervermögen : -1 und 0, bzw. TRUE und FALSE
Zeigertypen
----------------
Address Länge : 4 Byte
Kompatibel zu allen anderen Zeigertypen.
String Länge : 4 Byte
Der String ist in PCQ als Zeiger auf Chars definiert.
File Typen
--------------
Text Ein Text-File ist ein normales ASCII-File.
Typed Files Ein bestimmtes File, deklariert als "File of Type",
beinhaltet nur Werte des gegebenen Typs.
===================================================================
Vorbestimmte Konstanten
===================================================================
False Gehört zum Typ Boolean und enthält den Wert 0.
MaxInt MaxInt kennzeichnet den größtmöglichen Integerwert, 2.147.483.647
oder $7FFFFFFF als Hexadezimalzahl.
MaxShort MaxShort ist der größte Wert für Short-Variablen, nämlich
32.767 oder $7FFF.
Nil Nil ist eine konstante Adresse, nämlich eine Adresse des Wertes 0.
True Gehört zum Typ Boolean und enthält den Wert -1.
===================================================================
Vorbestimmte Variablen
===================================================================
CommandLine Eine Stringvariable, die zu der Kommandozeile zeigt,
die der User eingegeben hat (wobei der Name
des Programms abgeschnitten ist). Sollte das
Programm von der Workbench gestartet worden sein, so
ist dieser Wert nicht definiert.
ExitAddr ExitAddr bestimmt den Ort innerhalb des Programmes, an
dem ein "Runtime Error" (Fehler während des Programm-
ablaufs) auftrat.
ExitCode Diese Variable wird an AmigaDOS zurückgegeben, wenn das
Programm beendet wird.
ExitProc Adresse der ersten Prozedur, die bei Beendigung des
Programmes ausgeführt wird.
HeapError Adresse einer Funktion, die aufgerufen wird, wenn
New() oderr AllocString() keinen Speicher belegen können.
Input Eine Varaible vom Typ Textfile, die auf den
Standardinput-Kanal zeigt.
Output Dasselbe, nur auf den Ausgabekanal bezogen.
===================================================================
Standardprozeduren
===================================================================
Close (FileVariable : Irgendein Filetyp)
Das File, das durch FileVariable repräsentiert wird, wird geschlossen.
Dec (V : Irgendein Ordinaler Typ oder Zeiger) oder
Dec (V, Anzahl : Integer)
Dec (=decrement) zieht eins (oder mehr) von einer Variablen ab.
Dec (x,n) ist daselbe wie x:=x-n, nur etwas effizienter. Gibt man
keine Anzahl an, dann wird dafür 1 angenommen. Bei Zeigern ist die
Dec-Routine mit etwas Vorsicht zu geniessen, da sie die abzuziehende
Anzahl mit der Größe der Variable, auf die der Zeiger weist, multipliziert.
Dispose (Variable : ^Irgendwas)
Gibt durch "New" belegten Speicher frei.
Exit oder
Exit (ReturnCode : Integer)
Beendet das Programm.
Get (var FileVariable : Ein Filetyp)
Bewegt den Filezeiger auf das nächste Element des Files, ohne etwas
einzulesen.
Inc (VarReference : Ordinal-Typ oder Zeiger) oder
Inc (VarReference : Ordinal-Typ oder Zeiger, Menge : Integer)
Dasselbe wie Dec, nur wird hier dazugezählt und nicht abgezogen.
New (ZeigerVar : ^Irgendwas)
Belegt einen Speicherbereich, der der Größe des Typs, auf den ZeigerVar
zeigt, entspricht.
Put (var FileVariable : Ein Filetyp)
Bewegt den Filezeiger hinter das momentane Element im File, wobei, falls
nötig, das aktuelle Element gespeichert wird.
Read (var FileVariable : Text oder File, Variablen....)
Liest Informationen eines AmigaDOS-Files. FileVariable ist optional. Die
Procedure Read kann eine variable Anzahl von Argumenten verarbeiten.
Readln (var FileVariable : Text, Variablen....)
Ähnlich wie Read, aber nur auf Textfiles anzuwenden, da es bis zum Beginn
einer neuen Zeile liest. Wird normalerweise für einfach Eingaben im
CLI verwendet.
Z.B. :
READLN (name); oder
READLN (zahl1 , zahl2);
Reset (var FileVar : File oder Text;
FileName : String;
BufferGröße : Integer);
Öffnet ein File um zu lesen. Der BufferGröße-Parameter ist optional.
Rewrite (var FileVar : File oder Text;
FileName : String;
BufferGröße : Integer);
Öffnet ein File zur Ausgabe, wobei ein existierendes File dieses Namens
gelöscht wird. Das BufferGröße-Element ist optional.
Trap (TrapNum : Integer)
Kann als automatischer Stoppunkt für manche Debugger verwendet werden.
Write (FileVariable : Text oder File, Ausdrücke...)
Write schreibt Informationen in ein AmigaDOS-File. FileVariable ist optional
und die Anzahl der Ausdrücke beliebig.
Writeln (FileVariable : Text, Ausdrücke....)
Ähnlich Write, setzt nach Ausgabe sämtlicher Ausdrücke ein Zeichen, das das
Ende der Linie kennzeichnet. Wird zur normalen Ausgabe ins CLI benutzt.
Beispiel :
WRITELN ('Hallo !');
WRITELN ('1 + 2 = ',1+2);
===================================================================
Standardfunktionen
===================================================================
Adr(Variable) : Address
Liefert die aktuelle Speicheradresse des Parameters zurück.
Abs(Zahlenausdruck) : entsprechender numerischer Typ
Liefert den Betrag. Abs(n) liefert n, wenn n positiv ist und -n, wenn es
negativ ist.
ArcTan(Zahlenausdruck) : Bogenmaß
Liefert den ArcusTangens.
Bit(BitNummer) : Masken-Integer
Liefert einen Integer, in dem nur das gewünschte Bit gesetzt ist, entspricht
(1 shl BitNummer).
Chr(Zahlenausdruck) : Char
Die Chr()-Funktion erzeugt aus einer als ASCII-Code interpretierten Zahl
das dazugehörige Zeichen.
Ceil(Fließkommeausdruck) : Real
Ceil() liefert den kleinsten ganzzahligen Wert größer oder gleich dem
übergebenen Ausdruck.
Cos(Zahlenausdruck im Bogenmaß) : Real
Kosinus-Funktion.
EOF(File oder Textvariable) : Boolean
EOF liefert True wenn das File zu Ende gelesen wurde, ansonsten False.
Exp(Zahlenausdruck) : Real
Exp(x) liefert e^x, wobei e - für alle die's vergessen haben - ungefähr
2.71828....
Float(Integer - Ausdruck) : Real
Die Float - Funktion konvertiert einen Integer in einen Fließkomma-Ausdruck.
Floor(Real - Ausdruck) : Real
Floor liefert die größte ganze Zahl kleiner oder gleich dem übergebenen
Parameter.
IOResult : Integer
IOResult überprüft, ob irgendwelche Fehler seit dem letzten Aufruf,
auftraten. Normalerweise fügt PCQ-Pascal Befehle ein, die das automatisch
überprüfen, aber wenn man die IO-Überprüfung (mit der {$I-} - Anweisung)
ausgeschaltet hat, muß man es selbst übernehmen.
Ln(Zahlenausdruck) : Real
Ln liefert den natürlich Logarithmus (den Logarithmus zur Basis e)
des Parameters.
Odd(Zahlenausdruck) : Boolean
Odd liefert TRUE, wenn das Argument ungerade ist, ansonsten FALSE.
Open(fname : String;
var fvar : file oder Text;
BufferGröße : Integer) : Boolean;
Open ist die Function-Form der Rewrite-Procedure. Öffnet ein File zum
Schreiben und löscht dabei jedes existierende File selben Namens. Wenn alles
glatt geht, liefert Open True, wenn nicht, dann False. BufferGröße ist
optional, muß also nicht angegeben werden.
Ord(Ordinaler Ausdruck) : Integer
Liefert den Integer-Wert des Parameters. Es kann z.B. Booleans und Chars
(hier den ASCII-Code) umwandeln.
Pred(Ordinaler Ausdruck) : selber Typ
Pred liefert der nächstkleineren Wert des übergebenen Parameters.
Z.B. ist Pred(2) = 1.
ReOpen(fname : String;
var fvar : file or text;
BufferGröße : Integer) : Boolean
ReOpen ist die Function-Form von Reset. Öffnet ein File zum Lesen
und liefert True, wenn alles funktionierte, ansonsten False.
BufferGröße ist wieder optional.
Round(Real-Ausdruck) : Integer
Round rundet einen Real-Ausdruck zum nächsten Integerausdruck.
Sin(Zahlenausdruck im Bogenmaß) : Real
Liefert den Sinus.
SizeOf(Typenbezeichner) : Integer
SizeOf liefert die Größe des angegebenen Typs.
Sqr(Zahlenausdruck) : selber Typ
Sqr(x)=x*x
Sqrt(Zahlenausdruck) : Real
Sqrt(x) liefert die Quadratwurzel von x.
Succ(Ordinaler Ausdruck) : selber Typ
Succ liefert den nächstgrößten Wert desselben Typs.
Tan(Zahlenausdruck im Bogenmaß) : Real
Liefert den Tangens.
Trunc(Real-Ausdruck) : Integer
Trunc liefert den ganzzahligen Anteil einer Fließkommazahl.
===================================================================
Operatoren
===================================================================
Operatoren, die sich auf einen Wert beziehen :
@ = Adr( )
- Negiert den Wert.
+ Hat keine Auswirkung, z.B. +3 = 3.
not Boolean oder bitweise Verneinung. Wenn der Wert ein
Boolean-Wert ist, liefert dieser Operator das Gegenteil.
Wenn er einen ganzzahliger Wert ist, dann liefert er
das bitweise Gegenstück.
Operatoren, die sich auf zwei Werte beziehen :
* Multiplikation
/ Fließkommadivision
div Ganzzahlige Division
mod Liefert den ganzzahligen Rest einer ganzzahligen Division.
So ist z.B. 10 MOD 3 = 1, da 10 DIV 3 = 3 ist und der Rest 1
beträgt.
and Logische Und-Funktion.
shl Shift left = Schiebe nach links. Verschiebt die Bits des linken
Arguments um so viele Stellen nach links, wie im rechten
Operanden angegeben.
shr Shift right. Wie shl, nur werden die Bits nach rechts
verschoben.
+ Addition
- Subtraktion
or Logisches Oder
xor Exklusives Oder
Ausdrücke, die Booleansche Werte zurückgeben :
= TRUE, wenn linker und rechter Operand gleich
<> TRUE, wenn linker und rechter Operand ungleich
> TRUE, wenn linker Operand größer als rechter
< TRUE, wenn linker Operand kleiner als rechter
>= TRUE, wenn linker Operand größer oder gleich rechter
<= TRUE, wenn linker Operand kleiner oder gleich rechter
===================================================================
Statements
===================================================================
<Statement> ::= <If Statement> |
<While Statement> |
<Repeat Statement> |
<For Statement> |
<Case Statement> |
<With Statement> |
<Compound Statement> |
<Assignment Statement> |
<Procedure Call> |
<Return Statement> |
<Goto Statement>
If Statements
---------------
<If Statement> ::= if <Boolean Ausdruck> then <Statement> |
if <Boolean Ausdruck> then <Statement>
else <Statement>
While Statements
------------------
<While Statement> ::= while <Boolean Ausdruck> do <Statement>
Repeat Statements
-------------------
<Repeat Statement> ::= repeat <Statements> until <Boolean Ausdruck>
<Statements> ::= <Statement> | <Statement> ; <Statements>
For Statements
----------------
<For Statement> ::= for <Variable> :=
<Ausdruck> <Richtung>
<Ausdruck> do <Statement>
<Richtung> ::= to | downto
Case Statements
-----------------
<Case Statement> ::= case <Ausdruck> of <Alternativen> end |
case <Ausdruck> of <Alternativen>
else <Statement> end
<Alternativen> ::= <Alternative> | <Alternative> ; <Alternativen>
<Alternative> ::= <Fälle> : <Statement>
<Fälle> ::= <Fall> | <Fall> , <Fälle>
<Fall> ::= <Konstanter Ausdruck> | <Konstanter Ausdruck> .. <Konstanter
Ausdruck>
With Statements
-----------------
<With Statement> ::= with <Ausdrücke> do <Statement>
<Ausdrücke> ::= <Ausdruck> | <Ausdruck> , <Ausdrücke>
Return Statements
-------------------
<Return Statement> ::= return
Es ist nur in Prozeduren erlaubt und erlaubt es ,diese augenblicklich
zu verlassen.
Goto Statements
-----------------
<Goto Statement> ::= goto <Identifier>
Sollte vermieden werden !
Ein Beispielprogramm für die gebräuchlichsten Statements :
PROGRAM Beispiel;
VAR i : Integer;
BEGIN
READLN (i);
IF i>10 THEN
WRITELN ('i > 10')
ELSE { IF - Statement }
WRITELN (' i<= 10');
WHILE i>0 DO { WHILE - Statement }
BEGIN
WRITELN ('i ist noch größer als Null !');
Dec (i);
END;
REPEAT { REPEAT UNTIL - Statement }
WRITELN ('Zähle wieder einen dazu !');
Inc (i);
UNTIL i=10;
FOR i:=2 TO 4 DO { FOR - Statement }
WRITELN ('i =',i);
CASE i OF
5 : BEGIN WRITE ('Dies ist durch die FOR-Schleife');
WRITELN (' die einzige mögliche Variante .');
END;
7 : WRITELN ('Unmöglich !!!');
ELSE
BEGIN
WRITELN ('Tja, hier gibt\'s auch nichts !');
WRITELN ('Es könnte aber mal passieren....');
WRITELN ('Seltsam !!! i = ',i);
END;
END; { CASE - Statement }
END.
===================================================================
Strings
===================================================================
Strings werden in PCQ-Pascal ähnlich wie in C behandelt. Der
String selbst ist nur eine Adresse eines Speicherbereiches, in dem
die einzelnen Chars dann gespeichert sind.
Um mit Strings zu arbeiten, muß ein Include-File mit
{$I "include:Utils/Stringlib.i"}
eingebunden werden. Hier finden sich alle wichtigen Routinen.
Um einen String benutzen zu können, muß man erst Speicherplatz für
seinen Inhalt schaffen :
String := AllocString(Größe : Integer);
Für den String wird ein Speicherbereich angelegt. Der String darf
also Größe-1 Zeichen lang sein.
Um Strings zu belegen, muß man
StrCpy (String,"Text");
anwenden. Weiteres zum Thema Strings entnehme man den Anmerkungen
im oben genannten Include-File.
Eine Besonderheit der Strings sind die Escape-Sequenzen :
\n Zeilenvorschub
\t Tabulator
\0 Null
\b Backspace
\e ESC
\c CSI (Control Sequence Introducer)
\a Attention
\f Form Feed
\r Carriage Return
\v Vertical Tab
\\ Einfach EIN Querstrich
\' EIN Anführungszeichen
\" EIN Gänsefüßchen